home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / LiveFastStartServer / MakeMovieHeader.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-26  |  3.9 KB  |  152 lines  |  [TEXT/CWIE]

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #include <QuickTimeComponents.h>
  5. #include <Movies.h>
  6. #include <StandardFile.h>
  7. #include <FixMath.h>
  8.  
  9. #define WIDTH 320L
  10. #define HEIGHT 240L
  11. #define FPS 4
  12. //#define FRAMESIZE 5000
  13. #define FRAMESIZE 10000
  14. #define DURATION (600/FPS)
  15. #define FRAMECOUNT (FPS*60*5)            // 5 minutes
  16.  
  17. static void makeThatThing( FSSpec *outFile )
  18. {
  19.     Handle h = NewHandleClear(FRAMESIZE);
  20.     Handle dataRef;
  21.     OSType dataRefType = HandleDataHandlerSubType;
  22.     OSErr err;
  23.     Movie m = 0;
  24.     Track track;
  25.     Media media;
  26.     ImageDescriptionHandle imageDesc = 0;
  27.     long i;
  28.     
  29.     (*h)[0] = 0x12;
  30.     (*h)[1] = 0x34;
  31.     (*h)[FRAMESIZE-2] = 0xcd;
  32.     (*h)[FRAMESIZE-1] = 0xef;
  33.     
  34.     err = PtrToHand( &h, &dataRef, sizeof(Handle) );
  35.     
  36.     m = NewMovie( 0 );
  37.     track = NewMovieTrack( m, WIDTH<<16, HEIGHT<<16, 0 );
  38.     media = NewTrackMedia( track, VideoMediaType, 600, dataRef, dataRefType );
  39.     
  40.     imageDesc = (ImageDescriptionHandle) NewHandleClear( sizeof( ImageDescription ) );
  41.  
  42.     (**imageDesc).idSize = sizeof(ImageDescription);
  43.     (**imageDesc).cType = kJPEGCodecType;
  44.     (**imageDesc).vendor = kAppleManufacturer;
  45.     (**imageDesc).temporalQuality = codecNormalQuality;
  46.     (**imageDesc).spatialQuality = 0;
  47.     (**imageDesc).width = WIDTH;
  48.     (**imageDesc).height = HEIGHT;
  49.     (**imageDesc).hRes = 72L << 16;
  50.     (**imageDesc).vRes = 72L << 16;
  51.     (**imageDesc).dataSize = 0L;
  52.     (**imageDesc).frameCount = 1;
  53.     (**imageDesc).depth = 24;
  54.     (**imageDesc).clutID = -1;
  55.     BlockMoveData( "\pLive", (**imageDesc).name, 5 );
  56.     
  57.     for( i = 0; i < FRAMECOUNT; i++ ) {
  58.         err = AddMediaSampleReference( media, 0, FRAMESIZE, DURATION, 
  59.                                  (SampleDescriptionHandle)imageDesc, 1, 0, nil );
  60.     }
  61.     
  62.     err = InsertMediaIntoTrack( track, 0, 0, GetMediaDuration( media ), fixed1 );
  63.     
  64.     DisposeMovie( 
  65.         FlattenMovieData( m, flattenAddMovieToDataFork + flattenForceMovieResourceBeforeMovieData, 
  66.                         outFile, 'TVOD', -1, 
  67.                         createMovieFileDeleteCurFile + createMovieFileDontCreateResFile ) );
  68.  
  69.     DisposeMovie( m );
  70. }
  71.  
  72. static void
  73. makeThatResource( FSSpec *movieFile, FSSpec *resFile )
  74. {
  75.     OSErr err = noErr;
  76.     short movieref = kResFileNotOpened;
  77.     Movie m = 0;
  78.     short resref = kResFileNotOpened;
  79.     short fref = 0;
  80.     long firstSampleOffset, size;
  81.     SampleDescriptionHandle  sampleDescriptionH = (SampleDescriptionHandle) NewHandle(0);
  82.     Handle h = nil;
  83.     
  84.     err = OpenMovieFile( movieFile, &movieref, fsRdPerm );
  85.     if( err ) { DebugStr( "\p omf" ); goto bail; }
  86.     err = NewMovieFromFile( &m, movieref, nil, 0, 0, 0 );
  87.     if( err ) { DebugStr( "\p nmff" ); goto bail; }
  88.     err = GetMediaSampleReference( GetTrackMedia( GetMovieTrack( m, 1 ) ),
  89.                 &firstSampleOffset, &size, 0,
  90.                 nil, nil, sampleDescriptionH, nil, 0, nil, 0 );
  91.     if( err ) { DebugStr( "\p gmsr" ); goto bail; }
  92.     
  93.     
  94.     h = NewHandle( firstSampleOffset );
  95.     HLockHi( h );
  96.     err = FSpOpenDF( movieFile, fsRdPerm, &fref );
  97.     if( err ) { DebugStr( "\p fspopendf" ); goto bail; }
  98.     err = FSRead( fref, &firstSampleOffset, *h );
  99.     if( err ) { DebugStr( "\p fsread" ); goto bail; }
  100.     
  101.     
  102.     FSpDelete( resFile );
  103.     FSpCreateResFile( resFile, 'RSED', 'RSRC', -1 );
  104.     resref = FSpOpenResFile( resFile, fsRdWrPerm );
  105.     if( resref == kResFileNotOpened ) {
  106.         DebugStr( "\p no res file" );
  107.         goto bail;
  108.     }
  109.     
  110.     AddResource( h, 'moo ', 128, "\p" );
  111.     
  112. bail:
  113.     if( m ) 
  114.         DisposeMovie( m );
  115.     if( movieref != kResFileNotOpened )
  116.         CloseMovieFile( movieref );
  117.     if( fref ) 
  118.         FSClose( fref );
  119.  
  120.     if( resref != kResFileNotOpened )
  121.         CloseResFile( resref );
  122. }
  123.  
  124. static void
  125. AppendSuffix( FSSpec *fileSpec, StringPtr suffix )
  126. {
  127.     short i;
  128.     if( fileSpec->name[0] > 31-suffix[0] )
  129.         fileSpec->name[0] = 31-suffix[0];
  130.     for( i = 1; i <= suffix[0]; i++ )
  131.         fileSpec->name[ ++fileSpec->name[0] ] = suffix[i];
  132. }
  133.  
  134. void main(void)
  135. {
  136.     StandardFileReply reply;
  137.     FSSpec resFile;
  138.     
  139.     printf( "Make movie header for %d fps\n", FPS );
  140.     
  141.     EnterMovies();
  142.     
  143.     StandardPutFile( "\pput!", "\ptemplate.mov", &reply );
  144.     if( reply.sfGood ) {
  145.         makeThatThing( &reply.sfFile );
  146.         
  147.         resFile = reply.sfFile;
  148.         AppendSuffix( &resFile, "\p.rsrc" );
  149.         makeThatResource( &reply.sfFile, &resFile );
  150.     }
  151. }
  152.